home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 004 / _quickcrt / !QuickCrt / s / QuickCaret
Text File  |  1993-06-12  |  4KB  |  149 lines

  1. ; s.QuickCaret
  2. ;
  3. ; QuickCaret written by Richard Millican...
  4. ; Ported to assembler by Tackline (aka Thomas Hawtin)
  5. ; Version 1.01 (12/06/93)
  6.  
  7. Xbit                    *       &20000
  8.  
  9. OS_GetEnv               *       &00010
  10. OS_ExitAndDie           *       &00050
  11. XOS_Module              *       &0001E :OR: Xbit
  12. OS_ReadMonotonicTime    *       &00042
  13. XWimp_Initialise        *       &400C0 :OR: Xbit
  14. Wimp_PollIdle           *       &400E1
  15. Wimp_GetPointerInfo     *       &400CF
  16. Wimp_SetCaretPosition   *       &400D2
  17. Wimp_GetCaretPosition   *       &400D3
  18. Wimp_CloseDown          *       &400DD
  19.  
  20. wimp_ESEND              *       17
  21. wimp_ESENDWANTACK       *       18
  22. wimp_msghdr_action      *       16
  23. wimp_MCLOSEDOWN         *       0
  24. wimp_mousestr_whandle   *       12
  25. wimp_caretstr_w         *       0
  26. Module_Claim            *       6
  27.  
  28. r0      RN      0
  29. r1      RN      1
  30. r2      RN      2
  31. r3      RN      3
  32. r4      RN      4
  33. r5      RN      5
  34. r12     RN      12
  35. sp      RN      13
  36. lr      RN      14
  37. pc      RN      15
  38.  
  39. taskH           *       &100
  40. wrkSize         *       &104
  41.  
  42. pollInterval    *       10              ; cs polling interval
  43.  
  44. ;       AREA    |main|, CODE, READONLY
  45.  
  46.  
  47. Module_BaseAddr
  48.         DCD     RM_Start   -Module_BaseAddr
  49.         DCD     RM_Init    -Module_BaseAddr
  50.         DCD     RM_Die     -Module_BaseAddr
  51.         DCD     RM_Service -Module_BaseAddr
  52.         DCD     RM_Title   -Module_BaseAddr
  53.         DCD     RM_HelpStr -Module_BaseAddr
  54.         DCD     RM_HC_Table-Module_BaseAddr
  55.  
  56.  
  57. RM_Init
  58.         STMFD   sp!, {lr}
  59.         LDR     r0, [r12]
  60.         TEQ     r0, #0                  ; [r12] = 0 iff re-init
  61.         MOVEQ   r0, #Module_Claim       ; w/s
  62.         MOVEQ   r3, #wrkSize            ; size of claim
  63.         SWIEQ   XOS_Module
  64.         MOVEQ   r0, r2
  65.         STREQ   r0, [r12]               ; store ptr in private word
  66.  
  67.         MOV     r1, #0                  ; w/s ptr
  68.         STR     r1, [r0, #taskH]        ; reset task handle
  69.  
  70.         LDMFD   sp!, {pc}
  71.  
  72.  
  73. RM_Die
  74.         STMFD   sp!, {lr}
  75.  
  76.         LDR     r12, [r12]              ; w/s ptr
  77.  
  78.         LDR     r0, [r12, #taskH]       ; get task handle
  79.         TEQ     r0, #0                  ; already running iff != 0
  80.         LDRNE   r1, taskCode
  81.         SWINE   Wimp_CloseDown          ; shut down
  82.         MOVNE   r0, #0                  ; mark inactive
  83.         STRNE   r0, [r12, #taskH]
  84.  
  85.         LDMFD   sp!, {pc}
  86.  
  87.  
  88. RM_Service * Module_BaseAddr
  89. RM_HC_Table * Module_BaseAddr
  90.  
  91.  
  92. RM_Start
  93.         LDR     sp, [r12]              ; w/s ptr
  94.         ADD     sp, sp, #4             ; single entry stack
  95.         BL      RM_Die
  96.  
  97.         LDR     r0, =200                ; Minimum Risc OS 2.00
  98.         LDR     r1, taskCode
  99.         ADR     r2, RM_Title
  100.         SWI     XWimp_Initialise
  101.         ADRVS   r3, RM_Title
  102.         SWIVS   OS_ExitAndDie
  103.         STR     r1, [r12, #taskH]
  104.  
  105. lp
  106.         SWI     OS_ReadMonotonicTime
  107.         ADD     r2, r0, #pollInterval   ; centiseconds
  108.         MOV     r0, #0
  109.         MOV     r1, r12
  110.         SWI     Wimp_PollIdle
  111.  
  112. ; check for close down message
  113.         CMP     r0, #wimp_ESEND
  114.         CMPNE   r0, #wimp_ESENDWANTACK
  115.         LDREQ   r0, [r12, #wimp_msghdr_action]
  116.         CMPEQ   r0, #wimp_MCLOSEDOWN 
  117.         ADREQ   r3, RM_Title
  118.         SWIEQ   OS_ExitAndDie
  119.  
  120. ; see if pointer and caret are in different window
  121.         SWI     Wimp_GetCaretPosition
  122.         LDR     r5, [r12, #wimp_caretstr_w]
  123.         SWI     Wimp_GetPointerInfo     ; r1 = r12
  124.         LDR     r0, [r12, #wimp_mousestr_whandle]
  125.         TEQ     r0, r5
  126.  
  127. ; move caret
  128.                                         ; r0 = whandle
  129.         MOVNE   r1, #-1                 ; no icon handle
  130.         MOVNE   r2, #0                  ; off (0,0)
  131.         MOVNE   r3, #0
  132.         MOVNE   r4, #-1                 ; no height/flags
  133.         MOVNE   r5, #-1                 ; no index into string
  134.         SWINE   Wimp_SetCaretPosition
  135.  
  136.         B     lp
  137.  
  138. taskCode
  139.         =       "TASK"
  140.  
  141. RM_Title
  142.         =       "QuickCaret\0"
  143.  
  144. RM_HelpStr
  145.         =       "QuickCaret\t1.01 (12 Jun 1993)\0"
  146.  
  147.  
  148.         END
  149.